﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using RC.ControlAcceso.ObjetosNegocio;
using RC.ControlAcceso.Reportes;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using Aspose.Cells;
using Aspose;

public partial class GenerarComprobantesEmpleado : System.Web.UI.Page
{
    #region miembros
    //private bool mHayDatos;
    //private string mPath;

    private string mNombreEmpresa;
    private string mCUIT;

    #endregion

    #region eventos control
    protected void Page_Load(object sender, EventArgs e)
    {   
            if (!IsPostBack)
            {   
            }   
    }
    protected void MostrarMensaje(string pMensaje, bool pEnVerde)
    {
        if (pEnVerde == true)
            lblMensaje.ForeColor = System.Drawing.Color.Green;
        else
            lblMensaje.ForeColor = System.Drawing.Color.Red;

        lblMensaje.Text = pMensaje;
        lblMensaje.Visible = true;
    } 

    private void Generar()
    {
        // Validar datos de entrada
        DateTime _fechaInicio;
        DateTime _fechaFin;
        int _legajoDesde = -1;
        int _legajoHasta = -1;
        int _IdSector = -1;
        DateTime _fechaDeEmision = DateTime.Today;

        #region Validaciones
        if (DateTime.TryParse(txtFechaIni.Text, out _fechaInicio) == false)
        {
            MostrarMensaje("La fecha de Desde no es válida", false);
            return;
        }
        if (DateTime.TryParse(txtFechaFin.Text, out _fechaFin) == false)
        {
            MostrarMensaje("La fecha Hasta no es válida", false);
            return;
        }
        if (_fechaInicio > _fechaFin)
        {
            MostrarMensaje("La fecha Desde es mayor que la fecha Hasta", false);
            return;
        }

        TimeSpan _ts = _fechaFin.Date - _fechaInicio.Date;
        if (_ts.Days > 7)
        {
            MostrarMensaje("El período debe ser menor o igual a 7 días", false);
            return;
        }

        if (ddlEmpleados.SelectedIndex < 0)
        {
            MostrarMensaje("Debe seleccionar un empleado", false);
            return;
        }
        MostrarMensaje("", false);
        #endregion

        _legajoDesde = int.Parse(ddlEmpleados.SelectedValue);
        _legajoHasta = _legajoDesde;

        _fechaInicio = _fechaInicio.Date; //la pongo con 00:00:00
        _fechaFin = _fechaFin.Date.AddDays(1).AddSeconds(-1); //lo pongo 23:59:59

        try
        {
            GenerarReporte2(_fechaInicio, _fechaFin, _legajoDesde, _legajoHasta, _IdSector, _fechaDeEmision);
        }
        catch (Exception ee)
        {
            MostrarMensaje(ee.Message, false);
        }
    }
    #endregion

    #region métodos
    private void InicializarObjetos()
    {
        mNombreEmpresa = System.Configuration.ConfigurationManager.AppSettings["Empresa"].ToString();
        mCUIT = System.Configuration.ConfigurationManager.AppSettings["Cuit"].ToString();

        //miEx = new AccesoExcel(false);
        //miPagina = new ConfiguracionPagina();
        //miPagina.Orientacion = enOrientacionPagina.opApaisado;
        //miRg = new Rango();

        //miEx.CrearLibro(false);
        //miEx.HojaActiva = "Hoja1";
        //miRg.AppExcel = miEx;
    }
    private void ArmarEncabezado()
    {

    }
    private void ArmarPie()
    {
    }
    private void GuardarCerrar(string pNombreArchivo, Excel.Application _exAplicacion, Excel.Workbook _exLibro, Excel.Sheets _exHojas, Excel.Worksheet _exHoja)
    {
        File.Delete(pNombreArchivo);

        _exAplicacion.Interactive = false;

        //_exAplicacion.Save(pNombreArchivo);
        object objMissing = System.Reflection.Missing.Value;
        _exLibro.SaveAs(pNombreArchivo, objMissing, objMissing, objMissing, objMissing, objMissing,
                Excel.XlSaveAsAccessMode.xlNoChange, objMissing, objMissing, objMissing, objMissing,
                objMissing);


        _exLibro.Close(null, null, null);
        _exAplicacion.Workbooks.Close();
        _exAplicacion.Quit();

        System.Runtime.InteropServices.Marshal.ReleaseComObject(_exHoja);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(_exHojas);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(_exLibro);
        ///System.Runtime.InteropServices.Marshal.ReleaseComObject(_exAplicacion);
        _exHoja = null;
        _exHojas = null;
        _exLibro = null;
        //_exAplicacion = null;

        while (Marshal.ReleaseComObject(_exAplicacion) != 0) { }
        _exAplicacion = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();

    }
    /// <summary>
    /// Carga los datos de los legajos en el archivo excel.
    /// </summary>
    /// <param name="pListStrucArchivoCES"></param>
    private void CargarDatos(CA2PersonalColeccion pLegajos, Excel.Worksheet pHoja)
    {
        int Col = 1;
        string HE = string.Empty;
        string HS = string.Empty;
        int Fila = 1;
        int _espacioEntreLegajosDeMismaHoja = 3;
        int _espacioEntreLegajosDistinaHoja = 0;
        int _cantidadLegajosPorHoja = 4;
        int _contadorLegajosPorHoja = 0;
        int _filasHastaPie = 10; // en la 10 esta la linea de abajo para que firmen
        int _filasHastaPieAux = 0;
        bool _tieneCodigoDeFalta = false;
        Excel.Range oResizeRange;


        foreach (CA2Personal _legajo in pLegajos)
        {
            if (_legajo.PartesDiarios != null)
            {
                ///////////////////////////////////////////////////
                // CONTROL DE SALTOS DE LINEA POR LEGAJOS EN HOJA
                // si es  el primero no salto la cantidad normal.
                if (Fila > 1)
                {
                    if (_cantidadLegajosPorHoja == _contadorLegajosPorHoja)
                    {// si es igual, significa que ya termino de poner los 4 de la hoja
                        // actual y hay que saltar a la siguiente.
                        _contadorLegajosPorHoja = 0;
                        Fila = Fila + _espacioEntreLegajosDistinaHoja;
                    }
                    else
                    { // El legajo que sigue esta dentro de la misna hoja
                        Fila = Fila + _espacioEntreLegajosDeMismaHoja;
                    }
                }

                //Aumento el contador de legajos en la misma hoja
                _contadorLegajosPorHoja = _contadorLegajosPorHoja + 1;

                /// FIN DE CONTROL
                /////////////////////////////////////////////////////////


                ///////////////////////////////////////////////////////
                /// Cargo el encabezado del Legajo
                //Fila++;
                /// Primer Fila ///
                //comprobante empleador

                EscribirCelda("Razón Social:", Fila, Col, ref pHoja);
                EscribirCelda(mNombreEmpresa, Fila, Col + 1, ref pHoja);
                EscribirCelda("CUIT:", Fila, Col + 2, ref pHoja);
                EscribirCelda(" " + mCUIT, Fila, Col + 3, ref pHoja);

                // comprobante empleado
                EscribirCelda("Razón Social:", Fila, Col + 5, ref pHoja);
                EscribirCelda(mNombreEmpresa, Fila, Col + 6, ref pHoja);
                EscribirCelda("CUIT:", Fila, Col + 7, ref pHoja);
                EscribirCelda(" " + mCUIT, Fila, Col + 8, ref pHoja);

                /// Seguna Fila ///
                Fila++;
                // comprobante empleador
                EscribirCelda("Nombre Apellido:", Fila, Col, ref pHoja);
                EscribirCelda(_legajo.Apellido.ToUpper() + " " + _legajo.Nombre.ToUpper(), Fila, Col + 1, ref pHoja);
                EscribirCelda("Legajo:", Fila, Col + 2, ref pHoja);
                EscribirCelda(_legajo.NumeroLegajo.ToString(), Fila, Col + 3, ref pHoja);
                //SeleccionarCeldas("D" + Fila, "D" + Fila, true);
                //AlinTexto = Alineaciones.Izquierda;

                // comprobante empleado
                EscribirCelda("Nombre Apellido:", Fila, Col + 5, ref pHoja);
                EscribirCelda(_legajo.Apellido.ToUpper() + " " + _legajo.Nombre.ToUpper(), Fila, Col + 6, ref pHoja);
                EscribirCelda("Legajo:", Fila, Col + 7, ref pHoja);
                EscribirCelda(_legajo.NumeroLegajo.ToString(), Fila, Col + 8, ref pHoja);
                //SeleccionarCeldas("I" + Fila, "I" + Fila, true);
                //AlinTexto = Alineaciones.Izquierda;

                /// Tercera Fila ///
                Fila++;
                // comprobante empleador
                EscribirCelda("CUIL:", Fila, Col, ref pHoja);
                EscribirCelda(_legajo.CUIL, Fila, Col + 1, ref pHoja);
                //SeleccionarCeldas("D" + Fila, "D" + Fila, true);
                //AlinTexto = Alineaciones.Izquierda;
                EscribirCelda("Fecha Emisión", Fila, Col + 2, ref pHoja);
                EscribirCelda(DateTime.Now.ToString("dd/MM/yyyy"), Fila, Col + 3, ref pHoja);

                // comprobante empleado                
                EscribirCelda("CUIL:", Fila, Col + 5, ref pHoja);
                EscribirCelda(_legajo.CUIL, Fila, Col + 6, ref pHoja);
                //SeleccionarCeldas("D" + Fila, "D" + Fila, true);
                //AlinTexto = Alineaciones.Izquierda;
                EscribirCelda("Fecha Emisión", Fila, Col + 7, ref pHoja);
                EscribirCelda(DateTime.Now.ToString("dd/MM/yyyy"), Fila, Col + 8, ref pHoja);

                ///////////////////
                // Le doy la linea horizontal doble      
                oResizeRange = pHoja.get_Range("A" + Fila.ToString(), "D" + Fila.ToString());
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle
                        = Excel.XlLineStyle.xlContinuous;
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).Weight
                        = Excel.XlBorderWeight.xlMedium;

                oResizeRange = pHoja.get_Range("F" + Fila.ToString(), "I" + Fila.ToString());
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle
                        = Excel.XlLineStyle.xlContinuous;
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).Weight
                        = Excel.XlBorderWeight.xlMedium;
                ////////////////////

                /// Cuarta Fila ///
                Fila++;
                // comprobante empleador
                EscribirCelda("Fecha Registro", Fila, Col + 1, ref pHoja);
                EscribirCelda("Hora Entrada", Fila, Col + 2, ref pHoja);
                EscribirCelda("Hora Salida", Fila, Col + 3, ref pHoja);

                // comprobante empleado
                EscribirCelda("Fecha Registro", Fila, Col + 6, ref pHoja);
                EscribirCelda("Hora Entrada", Fila, Col + 7, ref pHoja);
                EscribirCelda("Hora Salida", Fila, Col + 8, ref pHoja);
                /// Fin carga de encabezado
                //////////////////////////////////////////////////////// 

                ///////////////////////////////////////
                // Le pongo la linea abajo del encabezado
                //Borde miBorde = new Borde(IndiceBorde.Arriba);
                //miBorde.TipoLinea = EstiloLinea.Continua;
                //miBorde.Grosor = GrosorLinea.Delgado;

                //TiposBordes.Add(miBorde);
                //SeleccionarCeldas("B" + Fila, "C" + Fila, true);
                //ResetearFormato();

                //SeleccionarCeldas("G" + Fila, "H" + Fila, true);
                //ResetearFormato();
                // Fin linea abajo de encabezado
                ///////////////////////////////////////


                ////////////////////////////////////////////////////////
                /// Carga de los registros encontrados
                _filasHastaPieAux = _filasHastaPie;
                foreach (CA2ParteDiario _parteDiario in _legajo.PartesDiarios)
                {
                    // Descuento la fila hasta el pie
                    _filasHastaPieAux = _filasHastaPieAux - 1;

                    ///////////////////////////////////////////
                    /// Calculo las horas
                    // Hora de entrada
                    _tieneCodigoDeFalta = false;// inicializo para que lo indique al calcular la hora de entrada y salida.
                    if ((_parteDiario.LegajoCodigoFalta != null) // si tiene un codigo de falta
                        && (_parteDiario.FechaHoraEntradaMarcada == _parteDiario.FechaHoraSalidaMarcada)) // y no vino a trabajar, muestro la descripcion
                    {
                        HE = _parteDiario.LegajoCodigoFalta.CodigoFalta.Descripcion;
                        HS = "";
                        _tieneCodigoDeFalta = true;
                    }

                    if (_tieneCodigoDeFalta == false) // si no tiene codigo de falta, saco las horas normalmente
                    {
                        /// ENTRADA MARCADA
                        HE = "_____";
                        if (_parteDiario.FechaHoraEntradaMarcada != _parteDiario.FechaHoraSalidaMarcada)
                            HE = _parteDiario.FechaHoraEntradaMarcada.ToString("HH:mm");

                        /// SALIDA MARCADA
                        HS = "_____";
                        if ((_parteDiario.FechaHoraSalidaMarcada > CA2Parametros.FechaMinima) && (_tieneCodigoDeFalta == false) && (_parteDiario.FechaHoraEntradaMarcada != _parteDiario.FechaHoraSalidaMarcada))
                            HS = _parteDiario.FechaHoraSalidaMarcada.ToString("HH:mm");
                    }
                    /// Fin calculo las horas
                    ////////////////////////////////////////////////////////

                    Fila++;
                    /// Empleador ///
                    // Fecha de marca
                    EscribirCelda(" " + _parteDiario.FechaHoraEntradaProg.ToString("dd/MM/yyyy"), Fila, Col + 1, ref pHoja);

                    // Hora de entrada
                    EscribirCelda(" " + HE + " ", Fila, Col + 2, ref pHoja);

                    // Hora de salida
                    EscribirCelda(" " + HS + " ", Fila, Col + 3, ref pHoja);


                    /// Empleado ///
                    /// // Fecha de marca
                    EscribirCelda(" " + _parteDiario.FechaHoraEntradaProg.ToString("dd/MM/yyyy"), Fila, Col + 6, ref pHoja);

                    // Hora de entrada
                    EscribirCelda(" " + HE + " ", Fila, Col + 7, ref pHoja);

                    // Hora de salida
                    EscribirCelda(" " + HS + " ", Fila, Col + 8, ref pHoja);
                }
                // Fin carga de los registros encontrados
                //////////////////////////////////////////

                ////////////////////////////////////////////
                /// Cargo pie de legajo
                // corrijo la cantidad de filas hasta el pie (idependiente de la cantidad de 
                // registros escritos.
                Fila = Fila + _filasHastaPieAux;

                // empleador
                EscribirCelda("Copia empleador", Fila, Col, ref pHoja);


                EscribirCelda("Firma empleado", Fila, Col + 1, ref pHoja);
                //miBorde = new Borde(IndiceBorde.Arriba);
                //miBorde.TipoLinea = EstiloLinea.Continua;
                //miBorde.Grosor = GrosorLinea.Delgado;

                //TiposBordes.Add(miBorde);
                //SeleccionarCeldas("B" + Fila, "C" + Fila, true);
                //ResetearFormato();

                //empleado
                EscribirCelda("Copia empleado", Fila, Col + 5, ref pHoja);


                EscribirCelda("Firma responsable", Fila, Col + 6, ref pHoja);
                //fin empleado     

                /////////////////////////////////
                // Hago la linea de la firma
                Fila = Fila - 1; // Solo para corregir
                oResizeRange = pHoja.get_Range("B" + Fila.ToString(), "C" + Fila.ToString());
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle
                        = Excel.XlLineStyle.xlContinuous;
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).Weight
                        = Excel.XlBorderWeight.xlThin;

                oResizeRange = pHoja.get_Range("G" + Fila.ToString(), "H" + Fila.ToString());
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle
                        = Excel.XlLineStyle.xlContinuous;
                oResizeRange.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).Weight
                        = Excel.XlBorderWeight.xlThin;
                Fila = Fila + 1; // solo para corregir
                // Fin linea de firma
                ///////////////////////////////////////
                Fila = Fila + 1;
            }
        }


        AjustarAnchoCeldas();
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="pFila"></param>
    /// <param name="pColumna"></param>
    /// <param name="pHoja">Hoja excel</param>
    private void EscribirCelda(string pValor, int pFila, int pColumna, ref Excel.Worksheet pHoja)
    {
        ((Excel.Range)pHoja.Cells[pFila, pColumna]).Value2 = pValor;
    }
    private void abreVentana(string ventana)
    {
        //string Clientscript = "<script>window.open('" + ventana + "')</script>";

        //if (!this.IsStartupScriptRegistered("WOpen"))
        //{
        //    this.RegisterStartupScript("WOpen", Clientscript);
        //}
    }
    private void AjustarAnchoCeldas()
    {
        //comprobante empleador
        //miRg.SeleccionarCeldas("A1", "A1", true);
        //miRg.AnchoColumna(23);

        //miRg.SeleccionarCeldas("B1", "B1", true);
        //miRg.AnchoColumna(20);

        //miRg.SeleccionarCeldas("C1", "C1", true);
        //miRg.AnchoColumna(11);

        //miRg.SeleccionarCeldas("D1", "D1", true);
        //miRg.AnchoColumna(12);

        ////comprobante empleado
        //miRg.SeleccionarCeldas("E1", "E1", true);
        //miRg.AnchoColumna(5);

        //miRg.SeleccionarCeldas("F1", "F1", true);
        //miRg.AnchoColumna(23);

        //miRg.SeleccionarCeldas("G1", "G1", true);
        //miRg.AnchoColumna(20);

        //miRg.SeleccionarCeldas("H1", "H1", true);
        //miRg.AnchoColumna(11);

        //miRg.SeleccionarCeldas("I1", "I1", true);
        //miRg.AnchoColumna(12);

    }
    //private void GenerarReporte(DateTime pFechaDesde, DateTime pFechaHasta, int pLegajoDesde, int pLegajoHasta, int pIdSector)    
    //{           
    //    if (UCFiltroRPT1.idSector > 0)
    //        pIdSector = UCFiltroRPT1.idSector;

    //    ///////////////////////////////
    //    // Obtener colección
    //    // Obtengo los legajos
    //    CA2LegajoColeccion _legajos = new CA2LegajoColeccion();
    //    _legajos = _legajos.ObtenerLegajos(pLegajoDesde, pLegajoHasta, pIdSector);

    //    if ((_legajos == null)
    //        || (_legajos.Count == 0))
    //        throw new ArgumentException("No se encontraron legajos en el rango especificado.");

    //    //obtengo los partes diarios de los legajos
    //    foreach (CA2Legajo _legajo in _legajos)        
    //        _legajo.ObtenerPartesDiarios(pFechaDesde, pFechaHasta, _legajo);

    //    // Generar reporte
    //    string _archivoBase = Server.MapPath("Reportes") + "\\ComprobantesES.xls";
    //    string _archivoSalida = Server.MapPath("Reportes") + "\\Generados\\ComprobantesES.xls";        
    //    //File.Exists(_archivoSalida)
    //    //File.Delete(_archivoSalida);

    //    ////////////////////////
    //    /// Abro archivo excel
    //    Excel.Application _exAplicacion;
    //    Excel.Workbook _exLibro;
    //    Excel.Sheets _exHojas;
    //    Excel.Worksheet _exHoja = null;

    //    _exAplicacion = new Application();        
    //    _exLibro = _exAplicacion.Workbooks.Open(_archivoBase, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
    //    _exHojas = _exLibro.Worksheets;
    //    _exHoja = ObtenerHojaActiva(_exHojas, _exHoja);
    //    /// ///////////////////

    //    InicializarObjetos();
    //    ArmarEncabezado();
    //    CargarDatos(_legajos, _exHoja);
    //    ArmarPie();
    //    GuardarCerrar(_archivoSalida, _exAplicacion,_exLibro, _exHojas, _exHoja);
    //    Session["Pagina"] = "Reportes/Generados/ComprobantesES.xls";

    //    //abreVentana("CARedireccionar.aspx");
    //    Response.ContentType = "application/excel";
    //    Response.AppendHeader("Content-Disposition", "attachment; filename=ComprobantesES.xls");
    //    Response.TransmitFile(Server.MapPath("~/Reportes/Generados/ComprobantesES.xls"));
    //    Response.End();

    //}
    private void GenerarReporte2(DateTime pFechaDesde, DateTime pFechaHasta, int pLegajoDesde, int pLegajoHasta, int pIdSector, DateTime pFechaDeEmision)
    {

        CA2PersonalColeccion _legajos = new CA2PersonalColeccion();
        _legajos = CA2Personal.ObtenerEnrteLegajosYSectores(pLegajoDesde, pLegajoHasta, pIdSector, pIdSector);// _legajos.ObtenerLegajos(pLegajoDesde, pLegajoHasta, pIdSector);

        if ((_legajos == null)
            || (_legajos.Count == 0))
            throw new ArgumentException("No se encontraron legajos en el rango especificado.");

        pFechaHasta = pFechaHasta.Date.AddDays(1).AddSeconds(-1);
        //obtengo los partes diarios de los legajos
        foreach (CA2Personal _legajo in _legajos)
            _legajo.ObtenerPartesDiarios(pFechaDesde, pFechaHasta, _legajo);


        //////////////////////////////
        string _nombrePlantilla = "ComprobantesES.xls";
        //Abro el archivo plantilla
        Workbook workbook = new Workbook();
        //Open template
        string path = System.Web.HttpContext.Current.Server.MapPath("~");
        path += "\\Reportes\\" + _nombrePlantilla;

        workbook.Open(path);

        //Get the first worksheet in the workbook
        Worksheet worksheet = workbook.Worksheets[0];

        //Get the cells collection in the sheet
        Cells cells = worksheet.Cells;

        #region Carga de elementos
        mNombreEmpresa = System.Configuration.ConfigurationManager.AppSettings["Empresa"].ToString();
        mCUIT = System.Configuration.ConfigurationManager.AppSettings["Cuit"].ToString();

        cells = CargarDatos(_legajos, cells, pFechaDeEmision, worksheet);

        #endregion

        workbook.Save("Comprobantes.xls", FileFormatType.Default, SaveType.OpenInExcel, System.Web.HttpContext.Current.Response);

        cells = null;
        worksheet = null;
        workbook = null;
    }
    private Cells CargarDatos(CA2PersonalColeccion pLegajos, Cells pCells, DateTime pFechaDeEmision, Worksheet pworksheet)
    {

        int Col = 0;
        string HE = string.Empty;
        string HS = string.Empty;
        string _aux;
        int Fila = 0;
        int _espacioEntreLegajosDeMismaHoja = 3;
        int _espacioEntreLegajosDistinaHoja = 0;
        int _cantidadLegajosPorHoja = 4;
        int _contadorLegajosPorHoja = 0;
        int _filasHastaPie = 10; // en la 10 esta la linea de abajo para que firmen
        int _filasHastaPieAux = 0;
        bool _tieneCodigoDeFalta = false;

        #region Firma
        string _rutaImagen = System.Web.HttpContext.Current.Server.MapPath("~") + "\\images\\Firma.png";
        int _escala = 20;
        int _indexDeImagen;
        #endregion


        foreach (CA2Personal _legajo in pLegajos)
        {
            if (_legajo.PartesDiarios != null)
            {
                ///////////////////////////////////////////////////
                // CONTROL DE SALTOS DE LINEA POR LEGAJOS EN HOJA
                // si es  el primero no salto la cantidad normal.
                if (Fila > 1)
                {
                    if (_cantidadLegajosPorHoja == _contadorLegajosPorHoja)
                    {// si es igual, significa que ya termino de poner los 4 de la hoja
                        // actual y hay que saltar a la siguiente.
                        _contadorLegajosPorHoja = 0;
                        Fila = Fila + _espacioEntreLegajosDistinaHoja;
                    }
                    else
                    { // El legajo que sigue esta dentro de la misna hoja
                        Fila = Fila + _espacioEntreLegajosDeMismaHoja;
                    }
                }

                //Aumento el contador de legajos en la misma hoja
                _contadorLegajosPorHoja = _contadorLegajosPorHoja + 1;

                /// FIN DE CONTROL
                /////////////////////////////////////////////////////////


                ///////////////////////////////////////////////////////
                /// Cargo el encabezado del Legajo
                //Fila++;
                /// Primer Fila ///
                //comprobante empleador
                pCells[Fila, Col].PutValue("Razón Social:");
                pCells[Fila, Col + 1].PutValue(mNombreEmpresa);
                pCells[Fila, Col + 2].PutValue("CUIT:");
                pCells[Fila, Col + 3].PutValue(" " + mCUIT);

                // comprobante empleado
                pCells[Fila, Col + 5].PutValue("Razón Social:");
                pCells[Fila, Col + 6].PutValue(mNombreEmpresa);
                pCells[Fila, Col + 7].PutValue("CUIT:");
                pCells[Fila, Col + 8].PutValue(" " + mCUIT);

                /// Seguna Fila ///
                Fila++;
                // comprobante empleador
                pCells[Fila, Col].PutValue("Nombre Apellido:");
                pCells[Fila, Col + 1].PutValue(_legajo.Apellido.ToUpper() + " " + _legajo.Nombre.ToUpper());
                pCells[Fila, Col + 2].PutValue("Legajo:");
                pCells[Fila, Col + 3].PutValue(_legajo.NumeroLegajo.ToString());

                // comprobante empleado
                pCells[Fila, Col + 5].PutValue("Nombre Apellido:");
                pCells[Fila, Col + 6].PutValue(_legajo.Apellido.ToUpper() + " " + _legajo.Nombre.ToUpper());
                pCells[Fila, Col + 7].PutValue("Legajo:");
                pCells[Fila, Col + 8].PutValue(_legajo.NumeroLegajo.ToString());

                /// Tercera Fila ///
                Fila++;
                // comprobante empleador
                pCells[Fila, Col].PutValue("CUIL:");
                pCells[Fila, Col + 1].PutValue(_legajo.CUIL);
                pCells[Fila, Col + 2].PutValue("Fecha Emisión");
                pCells[Fila, Col + 3].PutValue(pFechaDeEmision.ToString("dd/MM/yyyy"));

                // comprobante empleado                
                pCells[Fila, Col + 5].PutValue("CUIL:");
                pCells[Fila, Col + 6].PutValue(_legajo.CUIL);
                pCells[Fila, Col + 7].PutValue("Fecha Emisión");
                pCells[Fila, Col + 8].PutValue(pFechaDeEmision.ToString("dd/MM/yyyy"));

                ///////////////////
                // Le doy la linea horizontal doble                      
                Aspose.Cells.Style style = pCells[Fila, 1].GetStyle();
                style.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;

                pCells[Fila, 0].SetStyle(style);
                pCells[Fila, 1].SetStyle(style);
                pCells[Fila, 2].SetStyle(style);
                pCells[Fila, 3].SetStyle(style);

                pCells[Fila, 5].SetStyle(style);
                pCells[Fila, 6].SetStyle(style);
                pCells[Fila, 7].SetStyle(style);
                pCells[Fila, 8].SetStyle(style);

                /// Cuarta Fila ///
                Fila++;
                // comprobante empleador
                pCells[Fila, Col + 1].PutValue("Fecha Registro");
                pCells[Fila, Col + 2].PutValue("Hora Entrada");
                pCells[Fila, Col + 3].PutValue("Hora Salida");

                // comprobante empleado
                pCells[Fila, Col + 6].PutValue("Fecha Registro");
                pCells[Fila, Col + 7].PutValue("Hora Entrada");
                pCells[Fila, Col + 8].PutValue("Hora Salida");
                /// Fin carga de encabezado
                //////////////////////////////////////////////////////// 

                ////////////////////////////////////////////////////////
                /// Carga de los registros encontrados
                _filasHastaPieAux = _filasHastaPie;
                foreach (CA2ParteDiario _parteDiario in _legajo.PartesDiarios)
                {
                    // Descuento la fila hasta el pie
                    _filasHastaPieAux = _filasHastaPieAux - 1;

                    ///////////////////////////////////////////
                    /// Calculo las horas
                    // Hora de entrada
                    _tieneCodigoDeFalta = false;// inicializo para que lo indique al calcular la hora de entrada y salida.
                    if ((_parteDiario.LegajoCodigoFalta != null) // si tiene un codigo de falta
                        && (_parteDiario.FechaHoraEntradaMarcada.ToString("HH:mm") == _parteDiario.FechaHoraSalidaMarcada.ToString("HH:mm"))) // y no vino a trabajar, muestro la descripcion
                    {
                        HE = _parteDiario.LegajoCodigoFalta.CodigoFalta.Descripcion;
                        HS = "";
                        _tieneCodigoDeFalta = true;
                    }

                    if (_tieneCodigoDeFalta == false) // si no tiene codigo de falta, saco las horas normalmente
                    {
                        /// ENTRADA MARCADA
                        HE = "_____";
                        if (_parteDiario.FechaHoraEntradaMarcada != _parteDiario.FechaHoraSalidaMarcada)
                            HE = _parteDiario.FechaHoraEntradaMarcada.ToString("HH:mm");

                        /// SALIDA MARCADA
                        HS = "_____";
                        if ((_parteDiario.FechaHoraSalidaMarcada > CA2Parametros.FechaMinima) && (_tieneCodigoDeFalta == false) && (_parteDiario.FechaHoraEntradaMarcada != _parteDiario.FechaHoraSalidaMarcada))
                            HS = _parteDiario.FechaHoraSalidaMarcada.ToString("HH:mm");
                    }
                    /// Fin calculo las horas
                    ////////////////////////////////////////////////////////

                    Fila++;
                    /// Empleador ///
                    // Fecha de marca
                    pCells[Fila, Col + 1].PutValue(" " + _parteDiario.FechaHoraEntradaProg.ToString("dd/MM/yyyy"));

                    // Hora de entrada
                    _aux = HE;
                    if (HE != "")
                        _aux = " " + HE + " ";
                    pCells[Fila, Col + 2].PutValue(_aux);

                    // Hora de salida
                    _aux = HS;
                    if (HS != "")
                        _aux = " " + HS + " ";
                    pCells[Fila, Col + 3].PutValue(_aux);

                    /// Empleado ///
                    /// // Fecha de marca
                    pCells[Fila, Col + 6].PutValue(" " + _parteDiario.FechaHoraEntradaProg.ToString("dd/MM/yyyy"));

                    // Hora de entrada
                    _aux = HE;
                    if (HE != "")
                        _aux = " " + HE + " ";
                    pCells[Fila, Col + 7].PutValue(_aux);

                    // Hora de salida
                    _aux = HS;
                    if (HS != "")
                        _aux = " " + HS + " ";
                    pCells[Fila, Col + 8].PutValue(_aux);
                }
                // Fin carga de los registros encontrados
                //////////////////////////////////////////

                ////////////////////////////////////////////
                /// Cargo pie de legajo
                // corrijo la cantidad de filas hasta el pie (idependiente de la cantidad de 
                // registros escritos.
                Fila = Fila + _filasHastaPieAux;

                // empleador
                pCells[Fila, Col].PutValue("Copia empleador");

                pCells[Fila, Col + 1].PutValue("Firma empleado");

                //empleado
                pCells[Fila, Col + 5].PutValue("Copia empleado");

                pCells[Fila, Col + 6].PutValue("Firma responsable");
                //fin empleado     

                //firma
                _indexDeImagen = pworksheet.Pictures.Add(Fila - 4, 6, _rutaImagen, _escala, _escala);
                pworksheet.Pictures[_indexDeImagen].Placement = PlacementType.FreeFloating;

                /////////////////////////////////
                // Hago la linea de la firma
                Fila = Fila - 1; // Solo para corregir
                style.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
                pCells[Fila, 1].SetStyle(style);
                pCells[Fila, 2].SetStyle(style);

                pCells[Fila, 6].SetStyle(style);
                pCells[Fila, 7].SetStyle(style);

                Fila = Fila + 1; // solo para corregir
                // Fin linea de firma
                ///////////////////////////////////////
                Fila = Fila + 1;
            }
        }
        return pCells;


        //AjustarAnchoCeldas();
    }
    #endregion
    protected void btnGenerarComprobantes_Click(object sender, EventArgs e)
    {
        Generar();
    }
}